//
// Created by Jisam on 08/10/2024 19:50.
// Solution of  c
#include <bits/stdc++.h>

#define  int long long
#define  endl "\n"
#define  all(x) (x).begin(),(x).end()
#define  pb push_back
using namespace std;

signed main() {
    // 读取部门数量n
    int n;
    cin >> n;

    // 初始化一个大小为n的整数向量a，存储各部门的人数
    vector<int> K(n);
    for (int i = 0; i < n; i++) {
        cin >> K[i];
    }

    // 初始化变量ans为最大长整数值，用于后续寻找最小的最大值
    long long ans = LLONG_MAX;

    // 定义一个递归函数dfs，用于深度优先搜索最小的最大午餐人数
    auto dfs = [&](auto dfs, int i, long long sumA, long long sumB) -> void {
        // 当索引i等于n时，表示所有部门已分配完毕
        if (i == n) {
            // 更新ans为当前两组人数的最大值的最小值
            ans = min(ans, max(sumA, sumB));
            return;
        }
        // 递归调用dfs，将当前部门分配给组A
        dfs(dfs, i + 1, sumA + K[i], sumB);
        // 递归调用dfs，将当前部门分配给组B
        dfs(dfs, i + 1, sumA, sumB + K[i]);
        return;
    };

    // 从索引0开始，初始两组人数均为0，开始深度优先搜索
    dfs(dfs, 0, 0, 0);

    // 输出最小的最大午餐人数
    cout << ans;

    return 0;
}
